/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once


#include <向量.h>
#include "引擎枚举数据.h"


typedef void(*fn_空间划分_数据添加删除)(void* data);

typedef struct _S_八叉树子空间 {
	_S_八叉树子空间*	m_子集[8];
	//S_VecSphere			m_坐标;
	vec3				m_坐标;
	float32				m_域大小;
	uint8				m_层;

	void* m_数据;

}S_八叉树子空间;

typedef struct _S_点距八叉树 {
	S_八叉树子空间*		m_空间;
	vec3				m_空间偏移;
	//此空间大小为BOX的宽度 不能是半径
	float32				m_空间大小;
	float32				m_最小单元大小;
	uint8				m_层深度;

	E_值类型			m_映射的数据类型;
	void*				m_映射的数据;
}S_点距八叉树;


S_点距八叉树* f_空间划分_create球形八叉树(float32 空间大小);
void	f_空间划分_destroy球形八叉树(S_点距八叉树* t);



void	f_空间划分_add子集(S_点距八叉树* t, const vec3& pos, const float32 半径, void* data);
S_八叉树子空间*	f_空间划分_add子集(S_点距八叉树* t, const vec3& pos, const float32 半径);
void	f_空间划分_从包围盒构建子集(S_点距八叉树* t, const std::vector<S_VecSphere>& 包围盒);
void	f_空间划分_remove子集(S_点距八叉树* t, const vec3& pos);
void	f_空间划分_remove所有子集(S_点距八叉树* t);


void	f_空间划分_get位置子集数据(S_点距八叉树* t, const vec3& pos, std::vector<void*>& data);
void	f_空间划分_get射线子集数据(S_点距八叉树* t, const vec3& 开始, const vec3& 结束, std::vector<S_八叉树子空间*>& data);
void	f_空间划分_线段查子空间(const S_点距八叉树* t, const S_线段& line, std::vector<S_八叉树子空间*>& data);

//void	f_空间划分_get范围子集数据(const S_点距八叉树* t, const S_VecSphere& 范围, std::vector<void*>& data);
void	f_空间划分_get范围子集数据(const S_点距八叉树* t, const S_VecSphere& 范围, std::vector<S_八叉树子空间*>& data, bool 是否包含数据 = false);

void	f_空间划分_set叉树空间大小(S_点距八叉树* t, float32 空间大小, vec3 offset);


void	f_空间划分_从坐标索引(S_点距八叉树* t, const std::vector<S_VecSphere>& 包围盒);




void	f_空间划分_解析为坐标(const S_点距八叉树* t, std::vector<vec4>& pos, bool 是否包含数据 = false);
void	f_空间划分_单元解析为坐标(const S_点距八叉树* t, std::vector<vec4>& pos);
void	f_空间划分_射线拾取结果解析为域坐标(S_点距八叉树* t, vec3 开始, const vec3& 结束, std::vector<vec4>& data);
void	f_空间划分_范围拾取解析为域坐标(S_点距八叉树* t, const S_VecSphere& 范围, std::vector<vec4>& data);












